Fork me on GitHub

Cryptanalyse de Vigenère

Le système de Vigenère

Le cryptosystème de Vigenère est un système de chiffrement symétrique poly-alphabétique. Il est basé sur les 26 lettres de l’alphabet latin en réalisant une substitution cyclique des symboles du texte clair. On en rappelle brièvement le principe.

La clef secrète est une chaîne de caractères (mieux si aléatoires), de longueur secrtète. Par exemple AXFRE est une clef de longueur 5. Le texte clair est préalablement réduit aux seules lettres de l’alphabet (tous les espaces, accents, etc. sont éliminés), ensuite chiffré en interprétant chaque caractère de la clef comme un décalage (A=0, B=1, etc.), le décalages étant appliqués successivement et cycliquement.

Voici un exemple de chiffrement du message “Attaquer à l’aube”:

 A  T  T  A  Q  U  E  R  A  L  A  U  B  E

 A  X  F  R  E  A  X  F  R  E  A  X  F  R
 0 23  5 17  4  0 23  5 17  4  0 23  5 17

 A  Q  Y  R  U  U  B  W  R  P  A  R  G  V
  1. Écrire un programme Java qui réalise le chiffrement et le déchiffrement d’un fichier par la méthode de Vigenère.

Pour lire et écrire un fichier au format texte il est conseillé d’utiliser les classes FileReader et FileWriter, qui réalisent les lectures et écriture caractère par caractère. Allez voir aussi Entrées-Sorties en Java.

Cryptanalyse

Le cryptosystème de Vigenère a longtemps été considéré incassable. Cependant, sa cryptanalyse est très aisée à l’aide des ordinateurs.

En supposant la longueur de la clef connue, un message peut être décrypté rapidement de la façon suivante:

Par exemple, le message de la section précédente est décomposé en 5 messages:

AUA
QBR
YWG
RRV
UP

Ces messages sont trop courts pour pouvoir faire une analyse statistique, mais s’ils avaient été plus longs, on aurait sans doutes remarqué que la lettre la plus fréquente dans le premier est la lettre E (E + A), dans le deuxième le B (E + X), dans le troisième le J (E + F), et ainsi de suite. De cette observation, on aurait immédiatement déduit les 5 textes clairs.

  1. Écrire un programme qui prend en entrée une longueur de clef et un texte chiffré, et qui applique la cryptanalyse décrite ci-dessus.

Challenge

Lorsque la longueur de la clef est inconnue, la cryptanalyse ci-dessus reste valable : la seule difficulté consiste à deviner la longueur de la clef. Cependant, la longueur de la clef ne peut pas être très importante : elle sera en général de l’ordre de quelques dizaines de symboles. Il ne reste plus qu’à essayer le programme que vous venez d’écrire avec des longueurs de plus en plus grandes jusqu’à tomber sur un texte qui fait du sens.

  1. Visitez cette page et décryptez le message fourni.

Deviner la longueur

S’il est vrai que les ordinateurs permettent de casser facilement le cryptosystème de Vigenère, à l’époque de son usage il restait néanmoins très difficile d’essayer toutes les longueurs possibles.

Friedman a été le premier à publier une méthode pour deviner la longueur de la clef de Vigenère avec beaucoup moins d’effort. Elle est basée sur l’indice de coïncidence.

Indice de coïncidence

On sait déjà que dans un texte français les lettres ne sont pas uniformément distribuées. Ceci n’est pas le seul biais statistique présent. L’indice de coïncidence mesure la probabilité que, si on prends deux lettres au hasard dans un texte donné, ces deux lettres soient la même.

On considère un texte (peu importe si clair ou chiffré) de longueur , et on note le nombre d’occurrences des lettres A, B, C, etc.

L’indice de coïncidence vaut alors

Pour s’en convaincre, il suffit de chercher la réponse aux questions suivantes (des exercices très élémentaires de combinatorie/probabilité) :

L’indice de coïncidence dépend, bien sûr, du texte choisi. Plus le texte est biaisé, plus il sera grand: par exemple, si le texte ne contient que des A, l’indice de coïncidence vaut , car, peu importe comment on les choisit, on est sûrs de tomber sur deux lettres identiques.

L’indice de coïncidence attendu

On cherche maintenant une approximation de l’indice de coïncidence pour la langue française. Nous allons appeler indice de coïncidence attendu cette approximation.

On considère un texte de longueur assez grande (on va faire comme si elle était infinie). On appelle la probabilité de tomber sur un A, un B, etc. si on prend une lettre au hasard dans ce texte.

En se posant les questions suivantes:

on arrive à la conclusion que l’indice de coïncidence attendu est égal à

Il est évident que l’indice attendu ne dépend que des probabilités d’apparition de chaque lettre dans la langue donnée.

Indices de coïncidence et Vigenère

Pour appliquer l’indice de coïncidence à la cryptanalyse de Vigenère, il suffit de faire quatre observations:

Supposons alors qu’on ne connaisse pas la longueur de la clef. Pour la deviner on procède comme suit:

On appliquant cette méthode à des de plus en plus grands, on s’arrête lorsqu’on rencontre un qui donne les bons indices de coïncidence.

À vos javac

  1. Modifier votre programme pour qu’il devine la longueur de la clef tout seul.

Soumettre votre devoir

Envoyez votre code source, ainsi que le texte décrypté à l’aide de la boîte de dépot sur e-campus 2 (si e-campus ne devait pas marcher, envoyez-les directement par mail à votre enseignant). La date limite pour envoyer vos fichiers est le mercredi 11 avril à 4h du matin. Un point de pénalité pour chaque heure de retard: le 11 avril à 23h59 c’est votre dernière chance !